package com.z996.spring6;


import org.junit.jupiter.api.Test;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;

/**
 * spring 对比之前和之后对比
 */
public class TestUser {
    private Logger logger = LoggerFactory.getLogger(TestUser.class);

    /**
     * @Author zfh18
     * @Description 使用 spring 之前
     * @Date 14:52 2024-01-30
     **/
    @Test
    public void testBeforeSpring() {
        logger.info("使用 spring框架 之前 [开始]");

        logger.info("创建对象");
        User user = new User();

        logger.info("使用对象");
        user.add();
        logger.info("使用 spring框架 之前 [结束]");
    }

    /**
     * @Author zfh18
     * @Description 使用 spring 之后
     * @Date 14:52 2024-01-30
     **/
    @Test
    public void testSpring() {

        logger.info("使用 spring框架 之后 [开始]");

        logger.info("加载 spring 配置文件, 创建对象");
        ClassPathXmlApplicationContext context = new ClassPathXmlApplicationContext("bean.xml");

        logger.info("根据 bean对象的唯一标识,获取对象");
        User user = (User) context.getBean("user");

        logger.info("使用对象");
        user.add();
        logger.info("使用 spring框架 之后 [结束]");

    }

    /**
     * @Author zfh18
     * @Description 反射创建对象, 重点:---> spring 底层创建对象原理
     * @Date 16:20 2024-01-30
     **/
    @Test
    public void testReflex() throws Exception {
        logger.info("反射创建对象, 重点:---> spring 底层创建对象原理 [开始]");

        logger.info("方法来加载指定名称的类");
        Class<?> aClass = Class.forName("com.z996.spring6.User");

        logger.info("使用反射机制来实例化");
        User user = (User) aClass.getDeclaredConstructor().newInstance();

        logger.info("使用对象");
        user.add();
        logger.info("反射创建对象, 重点:---> spring 底层创建对象原理 [结束]");

    }
}
